﻿//1319：【例6.1】排队接水
//【题目描述】
//有n个人在一个水龙头前排队接水，假如每个人接水的时间为Ti，请编程找出这n个人排队的一种顺序，使得n
//个人的平均等待时间最小。
//【输入】
//共两行，第一行为n(1≤n≤1000)；第二行分别表示第1个人到第n个人每人的接水时间T1，T2，…，Tn，每个数据之间有1个空格。
//
//【输出】
//有两行，第一行为一种排队顺序，即1到n的一种排列；第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
//
//【输入样例】
//10
//56 12 1 99 1000 234 33 55 99 812
//【输出样例】
//3 2 7 8 1 4 9 6 10 5
//291.90

#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;


struct Person {
	int id;
	int time;
};

bool compare(const Person& a, const Person& b)
{
	if (a.time == b.time)
	{
		return a.id < b.id;
	}
	return a.time < b.time;
}

int main()
{
	int n;
	cin >> n;
	vector<Person> people(n);
	for (int i = 0; i < n; i++)
	{
		cin >> people[i].time;
		people[i].id = i + 1;
	}
	sort(people.begin(), people.end(), compare);

	for (int i = 0; i < n; i++)
	{
		if (i != 0)
		{
			cout << " ";
		}
		cout << people[i].id;
	}
	cout << endl;

	long long total_wait_time = 0;
	long long sum_prev_times = 0;
	for (int i = 0; i < n; i++)
	{
		total_wait_time += sum_prev_times;
		sum_prev_times += people[i].time;
	}
	double average_wait_time = (double)total_wait_time / n;
	cout << fixed << setprecision(2) << average_wait_time << endl;
	return 0;
}